#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>



int main()
{

    pid_t id = fork();

    int status = 0;
    pid_t ret = 0;

    if(id == 0)//子进程
    {
       // int cnt = 3;
       // while(1)
       // {
        printf("我是子进程%d,我的父进程%d\n",getpid(),getppid());
        sleep(5);
        exit(10);
       // }
    }
    else if(id < 0)
    {
        printf("进程出错\n");
        return 1;
    }

    ///////////////// 为什么要进程等待？  父进程通过进程等待回收子程序资源(重要) 获取子进程退出信息(次要) ///////////////////////////////////////////////////////////////

    /*                    非阻塞进程等待         
     ->  非阻塞进程等待  - >  子进程没有结束，父进程依旧可以执行程序
    else
    {

        ret = waitpid(id,&status,WNOHANG); //非阻塞等待
        int cnt = 6;
        while(cnt--)
        {
        printf("我是父进程%d,我的父进程%d\n",getpid(),getppid());
       // sleep(6);
      //  ret = waitpid(id,&status,WNOHANG); //非阻塞等待
       // ret = waitpid(id,&status,0); //非阻塞等待
        if(ret == 0)
        {
            printf("等待子进程结束\n");
            

        }
        else if(ret == -1)
        {
    
        sleep(1);
            printf("等待出错%d\n",errno);
        }
        else
            printf("终止子进程\n");
        sleep(1);
        }
        
    }
*/
    

/****************阻塞式等待
 *执行流程  ->  当子进程没有结束，那么父进程一直会阻塞直到子进程总之才执行父进程
 *
 *
//   // pid_t rid = wait(NULL); //父进程阻塞，直到有子进程退出
//    pid_t rid = waitpid(id,&status,0);                       //函数返回值 rid 是退出子进程的进程 ID，如果返回 -1 表示等待出错
//    if(rid > 0)
//    {
//        //宏用于判断子进程是否正常退出。如果为真，通过 WEXITSTATUS(status) 宏获取子进程的退出码
//        if(WIFEXITED(status))
//        {
//            printf("退出子进程,id为:%d,退出码，%d\n",rid,WIFEXITED(status));
//        }
//        else
//            printf("子进程退出异常\n");
//    }
//
//    else
//    {
//        printf("等待出错%s,错误码%d\n",strerror(errno),errno);
//    }
******************************/





/*|************************ 进程终止  ***********************************
    printf("main");
    exit(20);    //退出时会进行缓冲器刷新(C语言提供)
    _exit(20);    //退出时不会进行缓冲器刷新(系统提供)




//      打印出错误码
//    int i = 0;
//    for(; i < 150; i++)
//    {
//
//        printf("%d->%s\n",i,strerror(i));
//    }







//
//    FILE* fi = fopen("log.tct","r");
//    if(fi == NULL)
//        return 11;
*/


    return 0;


}


